/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package autenticacao;

import beans.LogAcesso;
import beans.Modulo;
import beans.Usuario;
import crypt.Crypt;
import dao.LogAcessoDAO;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Thiago
 */
public class Sessao {

    public static int MAX_INACTIVE_INTERVAL = 1800;
    public static int MAX_AUTH_INTERVAL = 3600;
    public static int MAX_MODULE_INTERVAL = 1800000;
    private HttpSession session;
    private Crypt crypt = null;
    private final static String defaultKey = "zm74dVE9iWG8VFS2jybLdc5u+HVRPYlh";

    public Sessao(HttpSession session) {
        this();
        this.session = session;
    }

    public Sessao() {
        this.session = null;
        this.crypt = new Crypt();
    }

    public HttpSession getSession() {
        return session;
    }

    public void setSession(HttpSession session) {
        this.session = session;
    }

    public boolean validarSessao(String modulo) {
        boolean retorno = false;
        boolean retornoModulo = false;
        try {
            HttpSession sessao = this.getSession();
            if ((sessao == null)
                    || (sessao.getAttribute("userId") == null)
                    || (sessao.getAttribute("userPhrase") == null)) {
                return retorno;
            }
            Usuario usr = new Usuario();
            crypt.setKey(defaultKey);
            usr.setChave(crypt.Decifragem((String) sessao.getAttribute("userPhrase")));
            usr.setId((String) sessao.getAttribute("userId"));
            crypt.setKey(usr.getChave());
            if (modulo != null) {
                String[] modulos = (String[]) session.getAttribute("modulos");
                String aux = crypt.Decifragem(modulo);
                if ((aux != null) && (!aux.isEmpty())) {
                    String[] desafio = aux.split("@");
                    Date data = ferramentas.DataHora.retornarDataHora(desafio[1], ferramentas.DataHora.DATE_TIME_FORMAT);
                    if ((data != null) && (ferramentas.DataHora.retornarDataHoraAtual().getTime() - data.getTime()) < MAX_MODULE_INTERVAL) {
                        LogAcesso la = new LogAcesso();
                        la.setModulo(new Modulo());
                        la.getModulo().setId(Integer.parseInt(desafio[0]));
                        la.setUsuario(usr);
                        la.setDtLog(ferramentas.DataHora.retornarDataHoraAtual());
                        if (ferramentas.Vetor.busca(modulos, crypt.Cifragem(desafio[0])) > -1) {
                            retornoModulo = true;
                            la.setTipoLog(LogAcesso.TIP_LOG_ACESSO_MODULO);
                            new LogAcessoDAO().manterLogAcesso(la);
                        } else {
                            la.setTipoLog(LogAcesso.TIP_LOG_ACESSO_MODULO_INVALIDO);
                            new LogAcessoDAO().manterLogAcesso(la);
                        }
                    }
                }
            } else {
                retornoModulo = true;
            }
            String authTime = crypt.Decifragem((String) sessao.getAttribute("authTime"));
            Date at = ferramentas.DataHora.retornarDataHora(authTime, "dd/MM/yyyy HH:mm:ss");
            Date now = ferramentas.DataHora.retornarDataHoraAtual();
            long vat = Math.round((now.getTime() - at.getTime()) / 1000);
            long vtla = Math.round((now.getTime() - session.getLastAccessedTime()) / 1000);
            if ((vat >= MAX_AUTH_INTERVAL) || (vtla >= MAX_INACTIVE_INTERVAL)) {
                retorno = false;
                sessao.setAttribute("isValidSession", retorno && retornoModulo);
            } else {
                retorno = true;
                sessao.setAttribute("isValidSession", retorno && retornoModulo);
            }
        } catch (Exception ex) {
            Logger.getLogger(Sessao.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
        return retorno && retornoModulo;
    }

    public void removerAtributosSessao() {
        try {
            HttpSession sessao = this.getSession();
            sessao.removeAttribute("authTime");
            sessao.removeAttribute("timeLastAccess");
            sessao.removeAttribute("userId");
            sessao.removeAttribute("userName");
            sessao.removeAttribute("userPerfilName");
            sessao.removeAttribute("userPerfilId");
            sessao.removeAttribute("modulos");
            sessao.setAttribute("isValidSession", false);
        } catch (Exception e) {
        }
    }
}
